package org.example.Tools;

import java.util.*;

public class ListIteration {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 1; i <= 5; i++) {
            numbers.add(i);
        }

        // 1. 传统for循环（适合ArrayList）
        // 优点：
        //效率高：适用于 ArrayList 这样的随机访问结构，因为可以通过索引快速访问元素。
        //灵活：可以控制索引，实现跳步、倒序等复杂逻辑。
        //适合需要索引的操作：比如比较相邻元素、修改特定位置元素。
        //❌ 缺点：
        //不适合链表结构（如 LinkedList）：每次调用 get(i) 都需要从头开始遍历。
        //代码略显冗长
        System.out.println("--- For loop ---");
        for (int i = 0; i < numbers.size(); i++) {
            System.out.print(numbers.get(i) + " ");
        }

        // 2. 增强for循环
        // 优点：
        //语法简洁清晰，可读性强。
        //内部使用迭代器实现，对大多数集合结构都适用。
        //不需要关心索引或迭代细节。
        //❌ 缺点：
        //不能获取索引，无法进行基于索引的操作。
        //不能修改集合结构（如删除元素），否则会抛出 ConcurrentModificationException。
        //不支持反向遍历。
        System.out.println("\n\n--- Enhanced for loop ---");
        for (int num : numbers) {
            System.out.print(num + " ");
        }

        // 3. 迭代器
        //优点：
        //通用性强，适用于所有实现了 Iterable 接口的集合类。
        //支持在遍历时安全地删除元素（通过 it.remove()）。
        //比增强 for 循环更灵活。
        //❌ 缺点：
        //语法相对繁琐。
        //不支持通过索引访问元素。
        //只能单向遍历。
        System.out.println("\n\n--- Iterator ---");
        Iterator<Integer> it = numbers.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }

        // 4. ListIterator（双向遍历）
        //优点：
        //支持双向遍历（向前和向后）。
        //可以添加、修改、删除元素。
        //可获取当前索引位置。
        //❌ 缺点：
        //只能用于 List 类型的集合。
        //相比普通 Iterator 更复杂。
        //使用不当容易出错。
        System.out.println("\n\n--- ListIterator (reverse) ---");
        ListIterator<Integer> listIt = numbers.listIterator(numbers.size());
        while (listIt.hasPrevious()) {
            System.out.print(listIt.previous() + " ");
        }
        // 5. Java 8 forEach
        // 优点：
        //语法简洁，使用函数式编程风格。
        //内部基于 Iterable.forEach() 实现，兼容性好。
        //与 Stream API 结合使用时非常强大。
        //❌ 缺点：
        //不能中断遍历（除非抛异常）。
        //不能访问索引。
        //不适合做复杂的业务逻辑处理（如条件判断、跳出循环等）
        System.out.println("\n\n--- forEach ---");
        numbers.forEach(System.out::print);
    }
}